﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CSharpThreadPool
{
    /// <summary>
    /// 
    /// 1.关于线程池
    /// 在系统中预先开启一定个数的线程，当我们使用的时候，可以直接从线程池中去拿一个线程过来，用
    /// 完后，线程会及时放回线程池，方便下次使用，或其他程序使用
    /// 
    /// 2.线程池的好处
    /// 【1】避免每次都重新创建线程，从而提高效率
    /// 【2】防止过多的创建线程，从而影响程序性能
    /// 【3】框架会根据当前操作系统和CPU的综合状况，开启相对最优的线程个数
    /// 
    /// 3.使用注意
    /// 避免线程池中的线程长时间被占用完成某一任务，如果任务耗时较长，不适合使用线程池
    /// 
    /// 
    /// 
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Test2();
            Test3();
            Test4();

            Console.ReadLine();
        }

        static void Test1()
        {
            ThreadPool.QueueUserWorkItem((arg) =>
            {
                //请在这里编写实际需要处理的内容...

                Console.WriteLine("子线程Id:" +Thread.CurrentThread.ManagedThreadId);
            });
            Console.WriteLine("主线程Id:" + Thread.CurrentThread.ManagedThreadId);
        }

        static void Test2()  //使用线程池传递ID
        {
            ThreadPool.QueueUserWorkItem((arg) =>
            {
                //请在这里编写实际需要处理的内容...

                Console.WriteLine("子线程Id:" + Thread.CurrentThread.ManagedThreadId);

                Console.WriteLine("arg=" + arg);
            },"100000000020000000000");
            Console.WriteLine("主线程Id:" + Thread.CurrentThread.ManagedThreadId);
        }

        //线程池和普通线程的比较
        static void Test3()  //使用线程池传递ID
        {
            for (int i = 1; i <= 10; i++)
            {
                Thread thread = new Thread(() =>
                {
                    Console.WriteLine("子线程ID："+Thread.CurrentThread.ManagedThreadId);
                    for(int a = 1; a <= 5; a++)
                    {
                        Console.WriteLine(a);
                    }
                });
                thread.Name = "线程池名称:" + i;
                thread.IsBackground = true;
                thread.Start();
                Thread.Sleep(50);
            }
        }

        static void Test4()
        {
            Console.WriteLine("---------------使用线程池------------------");
            for(int i = 1;i <= 10;i++)
            {
                ThreadPool.QueueUserWorkItem((arg) =>
                {
                    Console.WriteLine("子线程ID：" + Thread.CurrentThread.ManagedThreadId);
                    for (int a = 1; a <= 5; a++)
                    {
                        Console.WriteLine(a);
                    }
                });
                Thread.Sleep(50);
            }
        }
    }
}
